package mx.ipn.escom.redes.gestionarequipo.controller;

import java.util.ArrayList;
import java.util.List;

import org.apache.struts2.convention.annotation.Namespace;

import mx.ipn.escom.redes.equipo.model.AplicacionSoftware;
import mx.ipn.escom.redes.equipo.model.CategoriaEquipo;
import mx.ipn.escom.redes.equipo.model.Documento;
import mx.ipn.escom.redes.equipo.model.Edificio;
import mx.ipn.escom.redes.equipo.model.Equipo;
import mx.ipn.escom.redes.equipo.model.Hardware;
import mx.ipn.escom.redes.equipo.model.Sala;
import mx.ipn.escom.redes.gestionaraplicacion.business.AplicacionBs;
import mx.ipn.escom.redes.gestionarcategoriaequipo.business.CategoriaEquipoBs;
import mx.ipn.escom.redes.gestionardocumentos.business.DocumentoBs;
import mx.ipn.escom.redes.gestionaredificio.business.EdificioBs;
import mx.ipn.escom.redes.gestionarequipo.business.EquipoBs;
import mx.ipn.escom.redes.gestionarhardware.business.HardwareBs;
import mx.ipn.escom.redes.gestionarsala.business.SalaBs;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

@SuppressWarnings("serial")
@Namespace("/equipo")
public class GestionarEquipoCtrl extends ActionSupport implements
		ModelDriven<Equipo> {

	private Integer idSel;

	private Equipo model;

	private EquipoBs equipoBs;

	private CategoriaEquipoBs categoriaEquipoBs;

	private AplicacionBs aplicacionBs;

	private HardwareBs hardwareBs;

	private EdificioBs edificioBs;

	private SalaBs salaBs;

	private DocumentoBs documentoBs;

	private List<Equipo> listaEquipos;

	private List<CategoriaEquipo> listaCategorias;

	private List<AplicacionSoftware> listaAplicacionSoftware;

	private List<Hardware> listaHardware;

	private List<Documento> listaDocumento;

	private List<Edificio> listaEdificio;

	private List<Sala> listaSala;

	private Integer accordionItemActivo;

	/**
	 * idElemento que se asociará al equipo
	 */
	private Integer idElemento;

	/**
	 * Indica si el elemento se asocia o no al equipo
	 */
	private Boolean checked;

	public String index() {
		ActionContext.getContext().getSession()
				.put("softwareAgregar", new ArrayList<Integer>());
		ActionContext.getContext().getSession()
				.put("hardwareAgregar", new ArrayList<Integer>());
		ActionContext.getContext().getSession()
				.put("documentoAgregar", new ArrayList<Integer>());
		System.out.println("Voy en el controller");
		listaEquipos = equipoBs.findAll();
		return "index";
	}

	public String editNew() {
		listaCategorias = categoriaEquipoBs.findAll();
		listaAplicacionSoftware = aplicacionBs.findAll();
		listaHardware = hardwareBs.findAll();
		listaDocumento = documentoBs.findAll();
		listaEdificio = edificioBs.findAll();
		listaSala = salaBs.findAll();
		return "editNew";
	}

	public String create() {

		List<Integer> softwareAgregar = (List<Integer>) ActionContext
				.getContext().getSession().get("softwareAgregar");
		List<Integer> hardwareAgregar = (List<Integer>) ActionContext
				.getContext().getSession().get("hardwareAgregar");
		List<Integer> documentoAgregar = (List<Integer>) ActionContext
				.getContext().getSession().get("documentoAgregar");
		System.out.println("softwareAgregar ----" + softwareAgregar);
		if (softwareAgregar == null || hardwareAgregar == null
				|| documentoAgregar == null || softwareAgregar.isEmpty()
				|| hardwareAgregar.isEmpty() || documentoAgregar.isEmpty()) {
			addActionError(getText("FALTAN_ELEMENTOS_REGISTRAR"));
			return editNew();
		}

		for (Hardware h : hardwareBs.obtenerHardwareIds(hardwareAgregar)) {
			System.out.println(h.getNombre() + " " + h.getIdHardware());
		}

		listaAplicacionSoftware = aplicacionBs
				.obtenerSoftwareIds(softwareAgregar);
		for (AplicacionSoftware h : listaAplicacionSoftware) {
			System.out.println(h.getNombre() + " " + h.getIdSoftware());
		}
		listaDocumento = documentoBs.obtenerDocumentoIds(documentoAgregar);
		for (Documento h : listaDocumento) {
			System.out.println(h.getNombre() + " " + h.getIdDocumento());
		}
		model.setListDocumento(listaDocumento);
		model.setListSoftware(listaAplicacionSoftware);
		System.out
				.println("-----------------------------------------------------------"
						+ model.getExistencia());
		equipoBs.save(model);
		return index();
	}

	public String edit() {
		listaCategorias = categoriaEquipoBs.findAll();
		for (CategoriaEquipo ce : listaCategorias) {
			System.out.println(ce.getIdCategoriaEquipo() + ", "
					+ ce.getNombre());
		}
		return "edit";
	}

	public String update() {
		equipoBs.update(model);
		return index();
	}

	public String deleteConfirm() {
		return "deleteConfirm";
	}

	public String destroy() {
		equipoBs.delete(model);
		return index();
	}

	public String agregarSoftware() {
		System.out.println("agregarSoftware");
		System.out.println("idelemento " + idElemento);
		System.out.println("agregaEliminar " + checked);
		List<Integer> softwareAgregar = (List<Integer>) ActionContext
				.getContext().getSession().get("softwareAgregar");
		if (softwareAgregar == null) {
			softwareAgregar = new ArrayList<Integer>();
		}

		if (!softwareAgregar.contains(idElemento) && checked) {
			softwareAgregar.add(idElemento);
		} else if (softwareAgregar.contains(idElemento) && !checked) {
			softwareAgregar.remove(idElemento);
		}

		for (Integer elemento : softwareAgregar)
			System.out.println(elemento);

		ActionContext.getContext().getSession()
				.put("softwareAgregar", softwareAgregar);
		accordionItemActivo = 1;
		return editNew();
	}

	public String agregarHardware() {
		System.out.println("agregarHardware");
		System.out.println("idelemento " + idElemento);
		System.out.println("agregaEliminar " + checked);

		List<Integer> hardwareAgregar = (List<Integer>) ActionContext
				.getContext().getSession().get("hardwareAgregar");
		if (hardwareAgregar == null) {
			hardwareAgregar = new ArrayList<Integer>();
		}

		if (!hardwareAgregar.contains(idElemento) && checked) {
			hardwareAgregar.add(idElemento);
		} else if (hardwareAgregar.contains(idElemento) && !checked) {
			hardwareAgregar.remove(idElemento);
		}

		for (Integer elemento : hardwareAgregar)
			System.out.println(elemento);

		ActionContext.getContext().getSession()
				.put("hardwareAgregar", hardwareAgregar);

		accordionItemActivo = 2;
		return editNew();
	}

	public String agregarDocumento() {
		System.out.println("agregarDocumento");
		System.out.println("idelemento " + idElemento);
		System.out.println("agregaEliminar " + checked);

		List<Integer> documentoAgregar = (List<Integer>) ActionContext
				.getContext().getSession().get("documentoAgregar");
		if (documentoAgregar == null) {
			documentoAgregar = new ArrayList<Integer>();
		}

		if (!documentoAgregar.contains(idElemento) && checked) {
			documentoAgregar.add(idElemento);
		} else if (documentoAgregar.contains(idElemento) && !checked) {
			documentoAgregar.remove(idElemento);
		}

		for (Integer elemento : documentoAgregar)
			System.out.println(elemento);

		ActionContext.getContext().getSession()
				.put("documentoAgregar", documentoAgregar);

		accordionItemActivo = 3;
		return editNew();
	}

	public Equipo getModel() {

		return model;
	}

	/**
	 * @return the idSel
	 */
	public Integer getIdSel() {
		return idSel;
	}

	/**
	 * @param idSel
	 *            the idSel to set
	 */
	public void setIdSel(Integer idSel) {
		this.idSel = idSel;
		if (this.idSel != null) {
			model = equipoBs.findById(this.idSel);
		} else {
			model = new Equipo();
		}

	}

	/**
	 * @param model
	 *            the model to set
	 */
	public void setModel(Equipo model) {
		this.model = model;
	}

	/**
	 * @return the listaEquipos
	 */
	public List<Equipo> getListaEquipos() {
		return listaEquipos;
	}

	/**
	 * @param listaEquipos
	 *            the listaEquipos to set
	 */
	public void setListaEquipos(List<Equipo> listaEquipos) {
		this.listaEquipos = listaEquipos;
	}

	/**
	 * @return the equipoBs
	 */
	public EquipoBs getEquipoBs() {
		return equipoBs;
	}

	/**
	 * @param equipoBs
	 *            the equipoBs to set
	 */
	public void setEquipoBs(EquipoBs equipoBs) {
		this.equipoBs = equipoBs;
	}

	/**
	 * @return the listaCategorias
	 */
	public List<CategoriaEquipo> getListaCategorias() {
		return listaCategorias;
	}

	/**
	 * @param listaCategorias
	 *            the listaCategorias to set
	 */
	public void setListaCategorias(List<CategoriaEquipo> listaCategorias) {
		this.listaCategorias = listaCategorias;
	}

	/**
	 * @return the categoriaEquipoBs
	 */
	public CategoriaEquipoBs getCategoriaEquipoBs() {
		return categoriaEquipoBs;
	}

	/**
	 * @param categoriaEquipoBs
	 *            the categoriaEquipoBs to set
	 */
	public void setCategoriaEquipoBs(CategoriaEquipoBs categoriaEquipoBs) {
		this.categoriaEquipoBs = categoriaEquipoBs;
	}

	/**
	 * @return the aplicacionBs
	 */
	public AplicacionBs getAplicacionBs() {
		return aplicacionBs;
	}

	/**
	 * @param aplicacionBs
	 *            the aplicacionBs to set
	 */
	public void setAplicacionBs(AplicacionBs aplicacionBs) {
		this.aplicacionBs = aplicacionBs;
	}

	/**
	 * @return the listaAplicacionSoftware
	 */
	public List<AplicacionSoftware> getListaAplicacionSoftware() {
		return listaAplicacionSoftware;
	}

	/**
	 * @param listaAplicacionSoftware
	 *            the listaAplicacionSoftware to set
	 */
	public void setListaAplicacionSoftware(
			List<AplicacionSoftware> listaAplicacionSoftware) {
		this.listaAplicacionSoftware = listaAplicacionSoftware;
	}

	/**
	 * @return the listaHardware
	 */
	public List<Hardware> getListaHardware() {
		return listaHardware;
	}

	/**
	 * @param listaHardware
	 *            the listaHardware to set
	 */
	public void setListaHardware(List<Hardware> listaHardware) {
		this.listaHardware = listaHardware;
	}

	/**
	 * @return the hardwareBs
	 */
	public HardwareBs getHardwareBs() {
		return hardwareBs;
	}

	/**
	 * @param hardwareBs
	 *            the hardwareBs to set
	 */
	public void setHardwareBs(HardwareBs hardwareBs) {
		this.hardwareBs = hardwareBs;
	}

	/**
	 * @return the documentoBs
	 */
	public DocumentoBs getDocumentoBs() {
		return documentoBs;
	}

	/**
	 * @param documentoBs
	 *            the documentoBs to set
	 */
	public void setDocumentoBs(DocumentoBs documentoBs) {
		this.documentoBs = documentoBs;
	}

	/**
	 * @return the listaDocumento
	 */
	public List<Documento> getListaDocumento() {
		return listaDocumento;
	}

	/**
	 * @param listaDocumento
	 *            the listaDocumento to set
	 */
	public void setListaDocumento(List<Documento> listaDocumento) {
		this.listaDocumento = listaDocumento;
	}

	/**
	 * @return the edificioBs
	 */
	public EdificioBs getEdificioBs() {
		return edificioBs;
	}

	/**
	 * @param edificioBs
	 *            the edificioBs to set
	 */
	public void setEdificioBs(EdificioBs edificioBs) {
		this.edificioBs = edificioBs;
	}

	/**
	 * @return the salaBs
	 */
	public SalaBs getSalaBs() {
		return salaBs;
	}

	/**
	 * @param salaBs
	 *            the salaBs to set
	 */
	public void setSalaBs(SalaBs salaBs) {
		this.salaBs = salaBs;
	}

	/**
	 * @return the listaEdificio
	 */
	public List<Edificio> getListaEdificio() {
		return listaEdificio;
	}

	/**
	 * @param listaEdificio
	 *            the listaEdificio to set
	 */
	public void setListaEdificio(List<Edificio> listaEdificio) {
		this.listaEdificio = listaEdificio;
	}

	/**
	 * @return the listaSala
	 */
	public List<Sala> getListaSala() {
		return listaSala;
	}

	/**
	 * @param listaSala
	 *            the listaSala to set
	 */
	public void setListaSala(List<Sala> listaSala) {
		this.listaSala = listaSala;
	}

	/**
	 * @return the accordionItemActivo
	 */
	public Integer getAccordionItemActivo() {
		return accordionItemActivo;
	}

	/**
	 * @param accordionItemActivo
	 *            the accordionItemActivo to set
	 */
	public void setAccordionItemActivo(Integer accordionItemActivo) {
		this.accordionItemActivo = accordionItemActivo;
	}

	/**
	 * @return the idElemento
	 */
	public Integer getIdElemento() {
		return idElemento;
	}

	/**
	 * @param idElemento
	 *            the idElemento to set
	 */
	public void setIdElemento(Integer idElemento) {
		this.idElemento = idElemento;
	}

	/**
	 * @return the checked
	 */
	public Boolean getChecked() {
		return checked;
	}

	/**
	 * @param checked
	 *            the checked to set
	 */
	public void setChecked(Boolean checked) {
		this.checked = checked;
	}

}
